﻿/*
 * 2023/2/27
 * 结果过滤器：对API的返回结果进行包装
 * 行为过滤器：也可以对API的结果者包装，同时也可以对请求的信息进行处理
 * 
 * 1、新建过滤器，并继承想要实现哪种过滤的接口，并实现
 * 2、将该过滤器进行注册（全局）
 * **/

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Net;

namespace Max.PH5_2008A.ShoppingCode.API.MyFilter
{
    /// <summary>
    /// 结果过滤器
    /// </summary>
    public class MyResultFilter : IResultFilter
    {
        public void OnResultExecuted(ResultExecutedContext context)
        {
            //返回的结果已经出来了，所以不能再进行处理
        }

        public void OnResultExecuting(ResultExecutingContext context)
        {
            //在返回的结果没来出之前，可以进行包装
            
        }
    }

    /// <summary>
    /// 行为过滤器
    /// </summary>
    public class MyActionrFilter : IActionFilter
    {
        //action执行之后
        public void OnActionExecuted(ActionExecutedContext context)
        {
            //先判断一下结果是null的就不处理
            var result = context.Result as ObjectResult;
            if (result == null)
                return;

            //行为处理结束，可以返回统一结果
            context.Result = new JsonResult(new
            {
                code = 200,
                message = "Success",
                data = result.Value
            });
        }

        //action执行之前
        public void OnActionExecuting(ActionExecutingContext context)
        {
            ////模型验证
            //if (context.ModelState.IsValid)
            //    return;

            //var modelState = context.ModelState.FirstOrDefault(f => f.Value.Errors.Any());
            //string errorMsg = modelState.Value.Errors.First().ErrorMessage;
            ////throw new Exception(errorMsg);
            //context.Result = new JsonResult(new
            //{
            //    code = (int)HttpStatusCode.BadRequest,
            //    message = errorMsg
            //});
        }
    }
}
